import { defineStore } from 'pinia';
import { ElMessage } from 'element-plus';
import { getToken, removeToken, setToken, isHaveToken, getCurrentUser, removeCurrentUser } from '@/utils/auth';
import { userPersonalInfo } from '@/api/user';
import { getUnreadMessage } from '../api/message';

export const useUserStore = defineStore('app', {
    state: () => ({
        // 是否加载中
        isLoading: false,
        // 是否登录
        isLogin: isHaveToken(),
        // 是否外部触发打开登录框
        openLogin: false,
        // 当前用户
        user: getCurrentUser(),
        // 分区列表
        channels: [],
        // 轮播图列表
        carousels: [],
        // 弹幕列表
        danmuList: [],
        // 未读消息数 分别对应"reply"/"at"/"love"/"system"/"whisper"/"dynamic"
        msgUnread: [0, 0, 0, 0, 0, 0],
        // 聊天列表
        chatList: [],
        // 当前聊天对象的uid (不是聊天的id)
        chatId: -1,
        // 当前页面是否在聊天界面
        isChatPage: false,
        // 用户与当前播放视频的互动数据 {love, unlove, coin, collect}
        attitudeToVideo: {},
        // 用户点赞的评论 id
        likeComment: [],
        // 用户点踩的评论 id
        dislikeComment: [],
        // 登录用户的收藏夹列表
        favorites: [],
        // 访问用户的收藏夹列表
        userFavList: [],
        // 热搜列表
        trendings: [],
        // 搜索到的相关数据数量 [视频, 用户]
        matchingCount: [0, 0],
        // 热搜列表
        trendings: [
            { content: '一个曾毅配了6个玲花～', type: 1 },
            { content: '妈妈从小对我讲，不要早恋，遇到你以后，我决定不听妈妈的话了。', type: 1 },
            { content: '爸爸的快乐我想象到了', type: 2 },
            { content: '哥哥的女朋友只能由我来选', type: 2 },
            { content: '我可以和你一起碎觉觉吗', type: 2 },
            { content: '一周七休日天天星期日', type: 2 },
        ],
        // 分类
        categories: [
            { id: '1', name: '番剧' }, { id: '2', name: '电影' }, { id: '3', name: '国创' }, { id: '4', name: '电视剧' },
            { id: '4', name: '综艺' }, { id: '4', name: '纪录片' }, { id: '4', name: '动画' }, { id: '4', name: '游戏' },
            { id: '4', name: '鬼畜' }, { id: '4', name: '音乐' }, { id: '4', name: '舞蹈' }, { id: '4', name: '影视' },
            { id: '4', name: '娱乐' }, { id: '4', name: '知识' }, { id: '4', name: '科技' }, { id: '4', name: '美食' },
            { id: '4', name: '生活' }, { id: '4', name: '汽车' }, { id: '4', name: '时尚' }, { id: '4', name: '运动' },
            { id: '4', name: '动物圈' }, { id: '4', name: 'VLOG' }, { id: '4', name: '搞笑' }
        ],
        // 实时通讯的socket
        ws: null,
    }),

    actions: {
        // 退出登录
        logout() {
            this.initData();
            removeCurrentUser();
            removeToken();
        },

        // 获取当前用户信息
        async getPersonalInfo() {
            try {
                const res = await userPersonalInfo();
                console.log("获取当前用户信息:" + JSON.stringify(res.data));
                if (res.code === 1) {
                    this.updateUser(res.data);
                    this.isLogin = true;
                } else {
                    removeToken();
                    removeCurrentUser();
                    this.initData();
                    ElMessage.error("请登录后查看");
                }
            } catch (error) {
                console.error(error);
            }
        },

        // 初始化数据
        initData() {
            this.isLogin = false;
            this.user = {};
            this.msgUnread = [0, 0, 0, 0, 0, 0];
            this.attitudeToVideo = {};
            this.favorites = [];
            this.likeComment = [];
            this.dislikeComment = [];
        },
        // 更新当前用户
        updateUser(user) {
            this.user = user;
        },
        // 更新轮播图列表
        updateCarousels(carousels) {
            this.carousels = carousels;
        },
        // 更新分区列表
        updateChannels(channels) {
            this.channels = channels;
        },

        // 更新收藏夹列表
        updateFavorites(favorites) {
            this.favorites = favorites;
        },

        // 更新搜索匹配数
        updateMatchingCount(matchingCount) {
            this.matchingCount[0] = matchingCount.videoCount;
            this.matchingCount[1] = matchingCount.userCount;
        },
        // 获取全部未读消息数
        async getMsgUnread() {
            const res = await getUnreadMessage();
            const data = res.data;
            this.msgUnread[0] = data.reply;
            this.msgUnread[1] = data.at;
            this.msgUnread[2] = data.love;
            this.msgUnread[3] = data.system;
            this.msgUnread[4] = data.whisper;
            this.msgUnread[5] = data.dynamic;
        },
        // 初始化websocket实例
        connectWebSocket() {
            return new Promise((resolve) => {
                if (this.ws) {
                    this.ws.close();
                    this.setWebSocket(null);// 关闭后清空 WebSocket 实例
                }
                const ws = new WebSocket('ws://localhost:7071/im');
                this.setWebSocket(ws);

                ws.addEventListener('open', () => {
                    this.handleWsOpen();
                    resolve(); // 解决 Promise
                });

                ws.addEventListener('close', () => this.handleWsClose());
                ws.addEventListener('message', e => this.handleWsMessage(e));
                ws.addEventListener('error', e => this.handleWsError(e));
            });
        },

        // 关闭后清空 WebSocket 实例
        async closeWebSocket() {
            if (this.ws) {
                await state.ws.close();
                this.setWebSocket(null);
            }
        },
        // 处理websocket事件 
        setWebSocket(ws) {
            this.ws = ws;
        },

        handleWsOpen() {
            console.log("websocket已建立");
        },
        handleWsClose() {
            // ElMessage.error("实时通信websocket关闭,请刷新页面重试");
            console.log("实时通信websocket关闭,请登录并刷新页面重试");
            this.isLogin = false;
            this.user = {};
            this.msgUnread = [0, 0, 0, 0, 0, 0];
            this.attitudeToVideo = {};
            this.favorites = [];
            this.likeComment = [];
            this.dislikeComment = [];
        },
        handleWsMessage(e) {
            const data = JSON.parse(e.data);
            // console.log(data);
            switch (data.type) {
                case "error": {
                    // 系统错误
                    if (data.data === "登录已过期") {
                        // 由于 App.vue 那先做获取用户资料在前，所以基本上这里不会出现登录过期的情况
                        this.isLogin = false;
                        this.user = {};
                        this.msgUnread = [0, 0, 0, 0, 0, 0];
                        this.attitudeToVideo = {};
                        this.favorites = [];
                        this.likeComment = [];
                        this.dislikeComment = [];
                        // 清除本地token缓存
                        localStorage.removeItem("Authorization");
                    }
                    ElMessage.error(data.data);
                    break;
                }
                case "reply": {
                    // 回复我的
                    let content = data.data;
                    // console.log(content);
                    switch (content.type) {
                        case "全部已读": {
                            this.msgUnread[0] = 0; // 清除回复我的的未读数
                            break;
                        }
                        case "接收": {
                            this.msgUnread[0]++;
                            break;
                        }
                    }
                    break;
                }
                case "at": {
                    // @ 我的
                    let content = data.data;
                    // console.log(content);
                    switch (content.type) {
                        case "全部已读": {
                            this.msgUnread[1] = 0; // 清除@我的的未读数
                            break;
                        }
                        case "接收": {
                            this.msgUnread[1]++;
                            break;
                        }
                    }
                    break;
                }
                case "love": {
                    // 收到的赞
                    let content = data.data;
                    // console.log(content);
                    switch (content.type) {
                        case "全部已读": {
                            this.msgUnread[2] = 0; // 清除收到的赞的未读数
                            break;
                        }
                        case "接收": {
                            this.msgUnread[2]++;
                            break;
                        }
                    }
                    break;
                }
                case "system": {
                    // 系统通知
                    let content = data.data;
                    // console.log(content);
                    switch (content.type) {
                        case "全部已读": {
                            this.msgUnread[3] = 0; // 清除系统通知的未读数
                            break;
                        }
                        case "接收": {
                            this.msgUnread[3]++;
                            break;
                        }
                    }
                    break;
                }
                case "whisper": {
                    // 我的消息（私聊）
                    let content = data.data;
                    // console.log(content);
                    switch (content.type) {
                        case "全部已读": {
                            this.msgUnread[4] = 0; // 清除我的消息的未读数
                            this.chatList.forEach(item => {
                                item.chat.unread = 0;   // 将聊天列表中的全部未读清除
                            })
                            break;
                        }
                        case "已读": {
                            const chatid = content.id;  // 聊天id（不是url那个参数mid）
                            const count = content.count;
                            this.msgUnread[4] = Math.max(0, this.msgUnread[4] - count);   // 减少相应的未读数
                            let chat = this.chatList.find(item => item.chat.id === chatid);
                            if (chat) {
                                chat.chat.unread = 0;   // 清除对应聊天的未读
                            }
                            break;
                        }
                        case "移除": {
                            const chatid = content.id;  // 聊天id（不是url那个参数mid）
                            const count = content.count;
                            this.msgUnread[4] = Math.max(0, this.msgUnread[4] - count);   // 减少相应的未读数
                            let i = this.chatList.findIndex(item => item.chat.id === chatid);
                            if (i !== -1) {
                                // 如果是当前聊天先关闭窗口
                                if (this.chatList[i].user.uid === this.chatId) this.chatId = -1;
                                this.chatList.splice(i, 1);    // 再移除这个聊天
                            }
                            break;
                        }
                        case "接收": {
                            const chat = content.chat;
                            const detail = content.detail;  // 新消息详情
                            const user = content.user;
                            // 按时间从最近到最远排序
                            const sortByLatestTime = list => {
                                list.sort((a, b) => {
                                    const timeA = new Date(a.chat.latestTime).getTime();
                                    const timeB = new Date(b.chat.latestTime).getTime();
                                    return timeB - timeA;
                                });
                            }
                            if (detail.userId === this.user.uid) {
                                // 如果发送方是自己
                                let chatItem = this.chatList.find(item => item.chat.userId === detail.anotherId);
                                if (chatItem && this.isChatPage) {
                                    // 如果该聊天存在并且当前在聊天界面 就尾插新消息以及更新时间并重排序
                                    chatItem.detail.list.push(detail);
                                    chatItem.chat.latestTime = chat.latestTime;
                                    sortByLatestTime(this.chatList);
                                }
                            } else {
                                // 如果发送方是别人 需要判断当前是否有一个页面在该聊天窗口以更新全部未读数
                                if (!content.online) {
                                    this.msgUnread[4]++;
                                }
                                // 不需判断当前页面是否聊天页面了 都要更新消息
                                let chatItem = this.chatList.find(item => item.chat.userId === detail.userId);
                                if (chatItem) {
                                    // 如果原来有这个聊天就更新数据
                                    chatItem.detail.list.push(detail);
                                    chatItem.chat = chat;
                                    sortByLatestTime(this.chatList);
                                } else {
                                    // 如果没有就创建聊天
                                    chatItem = {
                                        chat: chat,
                                        user: user,
                                        detail: {
                                            more: true,
                                            list: []
                                        }
                                    };
                                    chatItem.detail.list.push(detail);
                                    this.chatList.unshift(chatItem);
                                }
                            }
                            break;
                        }
                        case "撤回": {
                            const msgId = content.id;
                            const sendId = content.sendId;
                            const acceptId = content.acceptId;
                            let chat;
                            if (sendId === this.user.uid) {
                                // 发送者是自己，找接收者的聊天
                                chat = this.chatList.find(item => item.chat.userId === acceptId);
                            } else {
                                // 发送者是对方，找发送者的聊天
                                chat = this.chatList.find(item => item.chat.userId === sendId);
                            }
                            if (chat) {
                                // 找到对应消息更改字段
                                let msg = chat.detail.list.find(item => item.id === msgId);
                                if (msg) {
                                    msg.withdraw = 1;
                                }
                            }
                            break;
                        }
                    }
                    break;
                }
                case "dynamic": {
                    // 动态
                    let content = data.content;
                    // console.log(content);
                    switch (content.type) {
                        case "全部已读": {
                            this.msgUnread[5] = 0; // 清除动态的未读数
                            break;
                        }
                        case "接收": {
                            this.msgUnread[5]++;
                            break;
                        }
                    }
                    break;
                }
            }

        },
        handleWsError(_, e) {
            console.log("实时通信websocket报错: ", e);
        },
        // 更新弹幕列表
        updateDanmuList(danmuList) {
            this.danmuList = danmuList;
        },
        // 追加更新聊天列表
        updateChatList(chatList) {
            this.chatList.push(...chatList);
            console.log("pinia: ", this.chatList);
        },
        // 更新视频互动数据
        updateAttitudeToVideo(atv) {
            this.attitudeToVideo = atv;
            console.log("pinia中的视频互动数据: ", this.attitudeToVideo);
        },
    },
});
